﻿// Inner Fire 游戏引擎库
// MapBlocks - 地图Block绘制器
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：元素层（3）
// 对地图进行绘制，整个地图视为一个粒子系统。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-05-21

#pragma once

#include <dx/core/dx_core.h>
#include <dx/core/dx_element.h>
#include <dx/core/upload_buffer.h>
#include <dx/mesh/basic_render_item.h>
#include <dx/texture/dx_material.h>
#include <graphics/frame_resources_def.h>
#include <graphics/instanced_def.h>
#include <graphics/vertex_list.h>

namespace ifire::dx {

class MapBlocks : public BasicRenderItem {
public:
  MapBlocks(DxMesh* mesh, ikit::sstr sub_mesh_name, size_t count);
  MapBlocks(const MapBlocks& rhs) = delete;
  MapBlocks& operator=(const MapBlocks& rhs) = delete;
  ~MapBlocks() = default;

  // 对常驻的总项目进行更新（现在地图用不到这个，只是为了Shader和统一）
  void Update(UploadBuffer<InstancedSpriteConstants>* main_buffer);
  // 设置一个项目
  void SetBlock(size_t index, IVec3 position, IVec3 rotation, IVec3 scale,
      IVec2 tex_offset);

  const DxMesh* GetMesh() const { return mesh_; }
  void SetMaterial(Material* value) { material_ = value; }
  const Material* GetMaterial() const { return material_; }
  UINT GetDrawCount() const { return draw_count_; }
  UploadBufferPtr<MapBlockData>& data() { return items_; };
  void SetData(UploadBufferPtr<MapBlockData>&& data);

public:
  // 此项目的矩阵
  DirectX::XMFLOAT4X4 world;
  // 此项目的颜色
  IVec4 color;
  // 此项目中每一个子项目的缩放
  IVec3 scale;

private:
  // 此项目的精灵数量
  UINT draw_count_;
  // 对象的列表
  UploadBufferPtr<MapBlockData> items_;
  // 此项目的顶点（由一个模型直接赋予）
  DxMesh* mesh_;
  // 此项目的Submesh，
  const DxSubmesh& sub_mesh_;
  // 材质
  Material* material_;
};

using MapBlocksPtr = std::unique_ptr<MapBlocks>;

} // namespace ifire::dx